home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Disk / puriTEXT 1.1 / source / generals.c < prev    next >
Encoding:
Text File  |  1994-03-22  |  10.5 KB  |  449 lines  |  [TEXT/KAHL]

  1. //#define DEBUG 1
  2. // General procedures for 'puriTEXT'
  3. // Copyright (C) 1994 by Mizutori Tetsuya, 94/3/9, 94/3/21
  4.  
  5. #include <AppleEvents.h>
  6. #include <GestaltEqu.h>
  7. #include "Defines.h"
  8.  
  9. // Prototypes (generals.c)
  10. /***** Do Error Messages *****/
  11. void ErrorMessage( OSErr err, StringPtr string, Boolean fatal );
  12. void StopMessage( long errCode, StringPtr str1, StringPtr str2,long value );
  13. void NoteMessage( long errCode, StringPtr str1, StringPtr str2,long value );
  14. Boolean CautionMessage( long errCode, StringPtr str1, StringPtr str2,long value );
  15. void SetupParam( long errCode, StringPtr str1, StringPtr str2, long value );
  16. /***** Gestalt check *****/
  17. void GestaltCheck( OSType gestaltCode );
  18. /***** Get Text from resource *****/
  19. StringPtr GetIndText( long code, StringPtr text );
  20. /***** Pstring *****/
  21. //void TypToString( OSType type, StringPtr str );
  22. //void StringToTyp( StringPtr str, OSType *type );
  23. StringPtr Pstrcpy( StringPtr dst, const StringPtr src );
  24. StringPtr Pstrcat( StringPtr dst, const StringPtr src );
  25. short Pstrcmp( const StringPtr dst, const StringPtr src );
  26. short Pstrncmp( const StringPtr dst, const StringPtr src, Size k );
  27. /***** Read & Write resource *****/
  28. Boolean LoadRsrcPREF( PrefDataPtr dataBlock );
  29. void SaveRsrcPREF( PrefDataPtr dataBlock );
  30. /***** Window operations *****/
  31. void GetWindowRect( WindowPtr window, Rect *rect );
  32. /***** Dialog operations *****/
  33. Handle IGetTxtHand( DialogPtr dialog, short item );
  34. ControlHandle IGetCtlHand( DialogPtr dialog, short item );
  35. /***** Standard File Get & Put *****/
  36. Boolean GetFileDialog( short numTypes, SFTypeList typeList, FSSpec *theFSSpec );
  37. Boolean PutFileDialog( StringPtr prompt, Boolean *replacing, FSSpec *theFSSpec );
  38. /***** Menu Operation *****/
  39. short GetMenuInd( MenuHandle menu, StringPtr text );
  40. short TrackPopupMenu( ControlHandle theCntl );
  41. // end of Prototypes
  42.  
  43. // Define macros
  44. #define    EOS            '\0'
  45. #define    min(a,b)    ( (a)<(b) ? (a) : (b) )
  46. #define    COPY(d,s)    (*(d++)=*(s++))
  47. #define    rCOPY(d,s)    (*(d--)=*(s--))
  48. #define CharNumb(c) ((long) (unsigned char) (c))
  49. #define    SIGN(n)        ( (n)>0 ? 1 : ( (n)==0 ) ? 0 : -1 )
  50.  
  51. #define DEFVARlong(n) \
  52.     register long        n;
  53.  
  54. #define DEFVARlongs(n,m) \
  55.     register long        n;\
  56.     register long        m;
  57.  
  58. #define    DEFVARptr(d) \
  59.     register char *    d;\
  60.     d = (char *) dst;
  61.  
  62. #define    DEFVARptrs(d,s) \
  63.     register char *    d;\
  64.     register char *    s;\
  65.     d = (char *) dst;\
  66.     s = (char *) src;
  67.  
  68.  
  69. /***** Do Error Messages *****/
  70. void ErrorMessage( OSErr err, StringPtr string, Boolean fatal )
  71. {
  72.     Str31    text;
  73.  
  74.     NumToString( (long) err, text );
  75.  
  76.     ParamText( string, "\p\rError = ", text, "\p" );
  77.     StopAlert( kAlertID, kNilFilterProc );
  78.  
  79.     if ( fatal ) ExitToShell();
  80. }
  81.  
  82. void StopMessage( long errCode, StringPtr str1, StringPtr str2,long value )
  83. {
  84.     SetupParam( errCode, str1, str2, value );
  85.     StopAlert( kNoteAlertID, kNilFilterProc );
  86. }
  87.  
  88. void NoteMessage( long errCode, StringPtr str1, StringPtr str2,long value )
  89. {
  90.     SetupParam( errCode, str1, str2, value );
  91.     NoteAlert( kNoteAlertID, kNilFilterProc );
  92. }
  93.  
  94. Boolean CautionMessage( long errCode, StringPtr str1, StringPtr str2,long value )
  95. {
  96.     short    item;
  97.  
  98.     SetupParam( errCode, str1, str2, value );
  99.     item = CautionAlert( kCautionAlertID, kNilFilterProc );
  100.  
  101.     return( item == ok );
  102. }
  103.  
  104. void SetupParam( long errCode, StringPtr str1, StringPtr str2, long value )
  105. {
  106.     short    strListID, index;
  107.     Str255    text;
  108.     Str31    valueString;
  109.  
  110.     strListID = HiWord( errCode );
  111.     index = LoWord( errCode );
  112.  
  113.     NumToString( value, valueString);
  114.  
  115.     GetIndString( text, strListID, index );
  116.  
  117.     ParamText( text, str1, str2, valueString );
  118. }
  119.  
  120. /***** Gestalt check *****/
  121. void GestaltCheck( OSType gestaltCode )
  122. {
  123.     StringPtr    s1,s2,s3,s4;
  124.     long        feature, mask;
  125.     Boolean        result;
  126.     OSErr        err;
  127.  
  128.     switch ( gestaltCode ) {
  129.         case gestaltProcessorType:
  130.             mask = gestalt68020;
  131.             s1 = "\pError: Problem in calling Gestalt!";
  132.             s2 = "\pSorry, this program requires 68020 CPU, or later.";
  133.             break;
  134.         case gestaltSystemVersion:
  135.             mask = 0x0700;
  136.             s1 = "\pError: Problem in calling Gestalt!";
  137.             s2 = "\pSorry, this program requires System 7, or later.";
  138.             break;
  139.         case gestaltAppleEventsAttr:
  140.             mask = gestaltAppleEventsPresent;
  141.             s1 = "\pError: Problem in calling Gestalt!";
  142.             s2 = "\pError: Apple events not available!";
  143.             break;
  144.         case gestaltStandardFileAttr:
  145.             mask = gestaltStandardFile58;
  146.             s1 = "\pError: Gestalt for Standard File Package";
  147.             s2 = "\pError: Gestalt for The new Standard File Package";
  148.             break;
  149.         case gestaltFSAttr:
  150.             mask = gestaltHasFSSpecCalls;
  151.             s1 = "\pError: File System Attributes is not supported.";
  152.             s2 = "\pError: The new FSSpec File Manager is not supported.";
  153.             break;
  154.         default:
  155.             mask = 0;
  156.             s1 = "\pError: Gestalt for Unknown";
  157.             s2 = "\pError: Gestalt for Unknown";
  158.             break; }
  159.  
  160.     err = Gestalt( gestaltCode, &feature );
  161.         if ( err != noErr ) ErrorMessage( err, s1, true );
  162.  
  163.     switch ( gestaltCode ) {
  164.         case gestaltProcessorType:
  165.         case gestaltSystemVersion:
  166.             result = ( feature >= mask );
  167.             break;
  168.         case gestaltAppleEventsAttr:
  169.         case gestaltStandardFileAttr:
  170.         case gestaltFSAttr:
  171.             result = ( feature & (1L<<mask) != 0 );
  172.             break;
  173.         default:
  174.             result = false;
  175.             break; }
  176.  
  177.     if ( ! result ) ErrorMessage( err, s2, true );
  178. }
  179.  
  180. /***** Get Text from resource *****/
  181. StringPtr GetIndText( long code, StringPtr text )
  182. {
  183.     short    strListID, index;
  184.  
  185.     strListID = HiWord( code );
  186.     index = LoWord( code );
  187.  
  188.     GetIndString( text, strListID, index );
  189.  
  190.     return( text );
  191. }
  192.  
  193. /***** Pstring *****/
  194. #ifdef TYPE2STRING
  195. void TypToString( OSType type, StringPtr str )
  196. {
  197.     str[0] = 4;
  198.     BlockMove( &type, &str[1], 4 );
  199. }
  200.  
  201. void StringToTyp( StringPtr str, OSType *type )
  202. {
  203.     BlockMove( &str[1], type, 4 );
  204. }
  205. #endif TYPE2STRING
  206.  
  207. StringPtr Pstrcpy( StringPtr dst, const StringPtr src )
  208. {
  209.     DEFVARlong(n)
  210.     DEFVARptrs(d,s)
  211.  
  212.     n = CharNumb(*s);
  213.     while( n-- >= 0 ) COPY(d,s);
  214.  
  215.     return( dst );
  216. }
  217.  
  218. StringPtr Pstrcat( StringPtr dst, const StringPtr src )
  219. {
  220.     DEFVARlong(n)
  221.     DEFVARptrs(d,s)
  222.  
  223.     n = CharNumb(*d);
  224.     d += n;
  225.     n = CharNumb(*s);
  226.     *dst = CharNumb(*dst) + CharNumb(*src);
  227.  
  228.     ++d; ++s;
  229.     while ( --n >= 0 ) COPY(d,s);
  230.  
  231.     return( dst );
  232. }
  233.  
  234. short Pstrcmp( const StringPtr dst, const StringPtr src )
  235. {
  236.     DEFVARlongs(n,m)
  237.     DEFVARptrs(d,s)
  238.  
  239.     m = min( CharNumb(*d), CharNumb(*s) );
  240.     for ( n=0; n<=m; ++n ) {
  241.         if ( d[n] != s[n] ) break; }
  242.  
  243.     if ( n > m ) n = 0;
  244.     return( SIGN( CharNumb(d[n]) - CharNumb(s[n]) ) );
  245. }
  246.  
  247. short Pstrncmp( const StringPtr dst, const StringPtr src, Size k )
  248. {
  249.     DEFVARlongs(n,m)
  250.     DEFVARptrs(d,s)
  251.  
  252.     if ( k == 0 ) return( 0 );
  253.  
  254.     m = min( CharNumb(*d), CharNumb(*s) );
  255.     for ( n=1; (n<=m) && (n<=k); ++n ) {
  256.         if ( d[n] != s[n] ) break; }
  257.  
  258.     if ( n == k+1 ) return( 0 );
  259.     if ( n > m ) n = 0;
  260.     return( SIGN( CharNumb(d[n]) - CharNumb(s[n]) ) );
  261. }
  262.  
  263. /***** Read & Write resource *****/
  264. //#define    kPrefType        'PREF'
  265. //#define    kPrefID            128
  266.  
  267. /***** Read & Write resource *****/
  268. Boolean LoadRsrcPREF( PrefDataPtr dataBlock )
  269. {
  270.     Handle    theHandle;
  271.  
  272.     theHandle = GetResource( kPrefType, kPrefID );
  273.  
  274.     if ( theHandle == nil ) return( false );
  275.  
  276.     HLock( theHandle );
  277.     *dataBlock = *(PrefDataPtr) (*theHandle);
  278.     HUnlock( theHandle );    
  279.  
  280.     ReleaseResource( theHandle );
  281.  
  282.     return( true );
  283. }
  284.  
  285. void SaveRsrcPREF( PrefDataPtr dataBlock )
  286. {
  287.     Handle    theHandle;
  288.     OSErr    err;
  289.  
  290.     theHandle = GetResource( kPrefType, kPrefID );
  291.  
  292.     if ( theHandle == nil ) {
  293.         err = PtrToHand( dataBlock, &theHandle, sizeof(*dataBlock) );
  294.         AddResource( theHandle, kPrefType, kPrefID, "\pDefaults" );
  295.     } else {
  296.         SetResourceSize( theHandle, sizeof(*dataBlock) );
  297.         *(PrefDataPtr) (*theHandle) = *dataBlock;
  298.         ChangedResource( theHandle );
  299.     }
  300.  
  301.     if ( ResError() == noErr ) {
  302.         WriteResource( theHandle ); }
  303.  
  304.     ReleaseResource( theHandle );
  305. }
  306.  
  307. /***** Window operations *****/
  308. void GetWindowRect( WindowPtr window, Rect *rect )
  309. {
  310.     Rect    wRect;
  311.     GrafPtr    oldPort;
  312.  
  313.     GetPort( &oldPort );
  314.     SetPort( (GrafPtr) window );
  315.  
  316.     wRect = ((GrafPtr)window)->portRect;
  317.  
  318.     LocalToGlobal( &topLeft( wRect ) );
  319.     LocalToGlobal( &botRight( wRect ) );
  320.  
  321.     *rect = wRect;
  322.  
  323.     SetPort( oldPort );
  324. }
  325.  
  326. /***** Dialog operations *****/
  327. Handle IGetTxtHand( DialogPtr dialog, short item )
  328. {
  329.     short    iType;
  330.     Handle    iHndl;
  331.     Rect    iRect;
  332.  
  333.     GetDItem( dialog, item, &iType, &iHndl, &iRect );
  334.  
  335.     return( iHndl );
  336. }
  337.  
  338. ControlHandle IGetCtlHand( DialogPtr dialog, short item )
  339. {    
  340.     return( (ControlHandle) IGetTxtHand( dialog, item ) );
  341. }
  342.  
  343. /***** Standard File Get & Put *****/
  344. Boolean GetFileDialog( short numTypes, SFTypeList typeList, FSSpec *theFSSpec )
  345. {
  346.     StandardFileReply    reply;
  347.  
  348.     GestaltCheck( gestaltStandardFileAttr );
  349.  
  350.     StandardGetFile( kNilFilterProc, numTypes, typeList, &reply );
  351.  
  352.     if ( ! reply.sfGood ) return( false );    // return by "Cancel"
  353.  
  354.     *theFSSpec = reply.sfFile;
  355.  
  356.     return( true );                            // return by "Open"
  357. }
  358.  
  359. Boolean PutFileDialog( StringPtr prompt, Boolean *replacing, FSSpec *theFSSpec )
  360. {
  361.     StandardFileReply    reply;
  362.     StringPtr            defaultName;
  363.  
  364.     GestaltCheck( gestaltStandardFileAttr );
  365.  
  366.     defaultName = theFSSpec->name;
  367.  
  368.     StandardPutFile( prompt, defaultName, &reply );
  369.  
  370.     if ( ! reply.sfGood ) return( false );    // return by "Cancel"
  371.  
  372.     *replacing = reply.sfReplacing;
  373.     *theFSSpec = reply.sfFile;
  374.  
  375.     return( true );                            // return by "Open"
  376. }
  377.  
  378. /***** Menu Operation *****/
  379. short GetMenuInd( MenuHandle menu, StringPtr text )
  380. {
  381.     short    item;
  382.     Str255    itemString;
  383.  
  384.     for (item=1;item<=CountMItems(menu);++item) {
  385.         GetItem( menu, item, itemString );
  386. //        if ( Pstrcmp(text,itemString) == 0 ) return( item );
  387.         if ( Pstrncmp(text,itemString,4) == 0 ) return( item );
  388.     }
  389.  
  390.     return( 0 );
  391. }
  392.  
  393. typedef struct {
  394.     MenuHandle    mHandle;
  395.     short        mID;
  396.     char        mPrivate;
  397. } popupPrivateData, *popupPrivatePtr, **popupPrivateHandle;
  398.  
  399. short TrackPopupMenu( ControlHandle theCntl )
  400. {
  401.     WindowPtr    window;
  402.     MenuHandle    menu;
  403.     short        menuID;
  404.     short        item;
  405.     Point        menuSize;
  406.     Rect        itemRect;
  407.     short        itemNumb;
  408.     Point        mousePos;
  409.     Boolean        result;
  410.     GrafPtr        oldPort;
  411.  
  412.     window = (**theCntl).contrlOwner;
  413.  
  414. //    menuID = GetCRefCon( theCntl );        // Note: 'RefCon' shold hold menuID !!
  415. //    menu = GetMenu( menuID );
  416.     menuID = ( (popupPrivateData *) (*((**theCntl).contrlData)))->mID;
  417.     menu   = ( (popupPrivateData *) (*((**theCntl).contrlData)))->mHandle;
  418.     if ( menu == nil ) return( 0 );        // If no menu for the Control, return( 0 )
  419.     itemNumb = CountMItems( menu );
  420.     menuSize.h = (**menu).menuWidth;
  421.     menuSize.v = (**menu).menuHeight;
  422.  
  423.     item = GetCtlValue( theCntl );
  424.  
  425.     itemRect = (**theCntl).contrlRect;;
  426.     itemRect.top  += 1;
  427.     itemRect.left += 1;
  428.     itemRect.bottom    = itemRect.top + menuSize.v/itemNumb;
  429.     itemRect.right    = itemRect.left + menuSize.h;
  430.  
  431.     result = false;
  432.  
  433.     GetPort( &oldPort );
  434.     SetPort( window );
  435.  
  436.     if ( menuSize.h < 0 && menuSize.v < 0 ) result = true;
  437.  
  438.     GetMouse( &mousePos );
  439.     if( PtInRect( mousePos, &itemRect ) ) result = true;
  440.  
  441.     SetPort( oldPort );
  442.  
  443.     if ( ! result ) item = 0;
  444.  
  445.     return( item );    // If mouse was released outside the menu, return( 0 )
  446. }
  447.  
  448. // end of program
  449.